﻿#include "KVMManagerWidget.h"

#include "ui_KVMManagerWidget.h"
#include "InputNodeDialog.h"

#include <QTableWidgetItem>
#include <QMessageBox>
#include <QDebug>

KVMManagerWidget::KVMManagerWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::KVMManagerWidget)
{
    ui->setupUi(this);

    // 去除单元格选中后出现的虚线框
    ui->tableWidget->setFocusPolicy(Qt::NoFocus);
    ui->tableWidget_2->setFocusPolicy(Qt::NoFocus);

    // 设置数量
    ui->tableWidget->setRowCount(3);
    ui->tableWidget->setColumnCount(3);
    // 设置表头
    QStringList headerLabels;
    headerLabels << QStringLiteral("编号")
                 << QStringLiteral("状态")
                 << QStringLiteral("IP地址/域名");
    ui->tableWidget->setHorizontalHeaderLabels(headerLabels);
    // 列的宽度随内容自适应
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
    //设置列间距
    ui->tableWidget->horizontalHeader()->setDefaultSectionSize(20);
    // 下面的几个设置都可以在界面设计器里面进行点选配置
    // 最后一列自动填满可用区域
    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
    // 不要高亮，不然会出现很丑的高亮阴影
    ui->tableWidget->horizontalHeader()->setHighlightSections(false);

    // 开始设置表格内容
    ui->tableWidget->setItem(0, 0, new QTableWidgetItem("01"));
    // 使用QTableWidget内置的Icon，但是图标无法居中显示
//    ui->tableWidget->setItem(0, 1, new QTableWidgetItem(QIcon("://assets/green-ball.png"), ""));
    // 可以使用自定义的QLabel使图标居中显示
    QLabel* statusLable = new QLabel();
    // 这里需要做个兼容，因为每个操作系统下的风格不一样，导致大小有差异
#ifdef Q_OS_LINUX
    QSize iconSize(17, 17);
#else
    QSize iconSize(24, 24);
#endif
    statusLable->setPixmap(QPixmap("://assets/green-ball.png")
                           .scaled(iconSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
    statusLable->setAlignment(Qt::AlignCenter);
    ui->tableWidget->setCellWidget(0, 1, statusLable);
    ui->tableWidget->setItem(0, 2, new QTableWidgetItem(QStringLiteral("Local/鼠标")));

    ui->tableWidget->setItem(1, 0, new QTableWidgetItem("02"));
    ui->tableWidget->setItem(1, 1, new QTableWidgetItem("--"));
    ui->tableWidget->setItem(1, 2, new QTableWidgetItem("192.168.123.192"));

    ui->tableWidget->setItem(2, 0, new QTableWidgetItem("03"));
    ui->tableWidget->setItem(2, 1, new QTableWidgetItem(QIcon("://assets/green-ball.png"), ""));
    ui->tableWidget->setItem(2, 2, new QTableWidgetItem("192.168.123.61"));

    // 设置所有单元格文本居中显示
    for(int i = 0; i < ui->tableWidget->rowCount(); ++i)
    {
        for(int j = 0; j < ui->tableWidget->columnCount(); ++j)
        {
            auto* item = ui->tableWidget->item(i,j);
            if(item)
            {
                item->setTextAlignment(Qt::AlignCenter);
            }
        }
    }

    ui->tableWidget_2->setRowCount(8);
    ui->tableWidget_2->setColumnCount(2);
    ui->tableWidget_2->setHorizontalHeaderLabels(
                QStringList { QStringLiteral("预案管理"), "" });
    // 列宽度自适应内容
    ui->tableWidget_2->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);

    QStringList itemContents;
    for (int i = 0; i < 8; ++i)
    {
        auto* itemCheckBox = new QTableWidgetItem(QStringLiteral("预案%1").arg(i + 1));
        itemCheckBox->setCheckState(Qt::Unchecked);
        itemCheckBox->setTextAlignment(Qt::AlignCenter);
        ui->tableWidget_2->setItem(i, 0, itemCheckBox);
    }

    // 信号与槽的绑定，列举三种写法
    // 1.传统写法
    connect(ui->tableWidget_2, SIGNAL(cellChanged(int,int)),
            this, SLOT(onTableCellChanged(int, int)));
    // 2.自动绑定，就不用手动调用connect来绑定了
    // 3.C++11的写法
    // a.使用成员函数（使用此写法可以不必在成员函数前写slots关键字）
    connect(ui->tableWidget_2, &QTableWidget::cellChanged, this, &KVMManagerWidget::onTableCellChangedByCpp11);
    // b.使用lambda表达式，槽函数比较简单时使用
    m_inputNodeDialog = new InputNodeDialog(this);
    connect(ui->pushButton_3, &QPushButton::clicked, [this] ()
    {
        m_inputNodeDialog->exec();
    });
}

KVMManagerWidget::~KVMManagerWidget()
{
    delete ui;
}

void KVMManagerWidget::onTableCellChanged(int row, int column)
{
    if (ui->tableWidget_2->item(row, column)->checkState() == Qt::Checked)
    {
        QMessageBox::information(this, QStringLiteral("提示"),
                                 QStringLiteral("你已选中第%1行（传统写法）").arg(row));
    }
}

void KVMManagerWidget::on_tableWidget_2_cellChanged(int row, int column)
{
    if (ui->tableWidget_2->item(row, column)->checkState() == Qt::Checked)
    {
        QMessageBox::information(this, QStringLiteral("提示"),
                                 QStringLiteral("你已选中第%1行（自动绑定）").arg(row));
    }
}

void KVMManagerWidget::onTableCellChangedByCpp11(int row, int column)
{
    if (ui->tableWidget_2->item(row, column)->checkState() == Qt::Checked)
    {
        QMessageBox::information(this, QStringLiteral("提示"),
                                 QStringLiteral("你已选中第%1行（C++11成员函数）").arg(row));
    }
}
